package com.loong.android.views.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.view.ViewParent;

import com.loong.android.views.LonView;

public interface ViewTemplate {

    /**
     * 取宽度
     */
    int width();

    /**
     * 置宽度
     * @param w 宽度
     */
    void width(int w);

    /**
     * 取高度
     */
    int height();

    /**
     * 置高度
     * @param h 高度
     */
    void height(int h);

    /**
     * 设置宽度和高度
     * @param w 宽度
     * @param h 高度
     */
    void setWidthHeight(int w, int h);

    /**
     * 设置最小宽度
     * @param w 宽度
     */
    void minWidth(int w);

    /**
     * 取最小宽度
     */
    int minWidth();

    /**
     * 设置最小高度
     * @param h 高度
     */
    void minHeight(int h);

    /**
     * 取最小高度
     */
    int minHeight();

    /**
     * 设置描述内容(setContentDescription)
     * @param des 描述
     */
    void description(String des);

    /**
     * 取描述内容(ContentDescription)
     */
    String description();

    /**
     * 置标签数据
     * @param t 数据
     */
    void tag(Object t);

    /**
     * 置标签数据
     * @param key 键名
     * @param t 数据
     */
    void tag(int key, Object t);

    /**
     * 取标签数据
     */
    Object tag();

    /**
     * 取标签数据
     * @param key 键名
     */
    Object tag(int key);

    /**
     * 设置透明度
     * @param a 透明度，0-1
     */
    void alpha(float a);

    /**
     * 取透明度
     * @return 0-1
     */
    float alpha();

    /**
     * 置内边距
     * @param left 左内边距
     * @param top 上内边距
     * @param right 右内边距
     * @param bottom 下内边距
     */
    void padding(int left, int top, int right, int bottom);

    /**
     * 置水平方向的内边距
     * @param left 左内边距
     * @param right 上内边距
     */
    void paddingX(int left, int right);

    /**
     * 置垂直方向的内边距
     * @param top 上内边距
     * @param bottom 下内边距
     */
    void paddingY(int top, int bottom);

    /**
     * 置左内边距
     * @param val 值
     */
    void paddingLeft(int val);

    /**
     * 取左内边距
     */
    int paddingLeft();

    /**
     * 置上内边距
     * @param val 值
     */
    void paddingTop(int val);

    /**
     * 取上内边距
     */
    int paddingTop();

    /**
     * 置右内边距
     * @param val 值
     */
    void paddingRight(int val);

    /**
     * 取右内边距
     */
    int paddingRight();

    /**
     * 置下内边距
     * @param val 值
     */
    void paddingBottom(int val);

    /**
     * 取下内边距
     */
    int paddingBottom();

    /**
     * 置外边距
     * @param left 左外边距
     * @param top 上外边距
     * @param right 右外边距
     * @param bottom 下外边距
     */
    void margin(int left, int top, int right, int bottom);

    /**
     * 置水平方向的外边距
     * @param left 左外边距
     * @param right 右外边距
     */
    void marginX(int left, int right);

    /**
     * 置垂直方向的外边距
     * @param top 上外边距
     * @param bottom 下外边距
     */
    void marginY(int top, int bottom);

    /**
     * 置左外边距
     * @param val 值
     */
    void marginLeft(int val);

    /**
     * 取左外边距
     */
    int marginLeft();

    /**
     * 置上外边距
     * @param val 值
     */
    void marginTop(int val);

    /**
     * 取上外边距
     */
    int marginTop();

    /**
     * 置右外边距
     * @param val 值
     */
    void marginRight(int val);

    /**
     * 取右外边距
     */
    int marginRight();

    /**
     * 置下外边距
     * @param val 值
     */
    void marginBottom(int val);

    /**
     * 取下外边距
     */
    int marginBottom();

    /**
     * 置可视状态
     *
     * @param v 可视状态，GONE: 消失不占位；INVISIBLE: 隐藏; VISIBLE: 可视
     */
    void visibility(int v);

    /**
     * 取可视状态
     * @return GONE: 消失不占位；INVISIBLE: 隐藏; VISIBLE: 可视
     */
    int visibility();


    /**
     * 关闭硬件加速
     */
    void closeHardwareAcceleration();

    /**
     * 从父布局中删除自己
     */
    void removeSelf();

    /**
     * 显示到顶层
     */
    void toTop();

    /**
     * 取上下文
     */
    Context getViewContext();

    /**
     * 取id
     */
    int getViewId();

    /**
     * 置视图id，需要android api 17才能使用
     */
    int setViewId();

    /**
     * 取类的名称
     */
    String getClassSimpleName();

    ViewParent getViewParent();

    /**
     * 取父布局id
     */
    int getViewParentId();

    /**
     * 置启用状态
     *
     * @param enabled 是否启用
     */
    void setEnabled(boolean enabled);

    /**
     * 获取焦点
     */
    void focus();

    /**
     * 取消焦点
     */
    void blur();

    /**
     * 置可否单击，默认为 false，若为 false，将无法产生click事件，onTouch事件中也无法触发弹起事件: ACTION_UP
     * 调用 setOnClick 函数后，自动置为 true
     * @param enable 可否
     */
    void clickable(boolean enable);

    /**
     * 置可否触发长按事件，默认为 false，若为false，无法触发longClick事件
     * 调用 setOnLongClick 函数后，自动置为 true
     * @param enable 可否
     */
    void longClickable(boolean enable);

    /**
     * 置可获取焦点，使得组件在非触屏设备上拥有获取焦点的能力。
     * @param enable 是否获取
     */
    void focusable(boolean enable);

    /**
     * 置可获取触摸屏模式的焦点，使得组件在触屏模式下获取焦点的能力
     * @param enable 是否获取
     */
    void focusableInTouchMode(boolean enable);

    /**
     * 设置背景颜色
     * @param color 颜色
     */
    void backgroundColor(int color);

    /**
     * 取背景颜色
     */
    int backgroundColor();

    /**
     * 设置线性渐变背景
     * @param x0 起点横坐标。0-1表示按视图宽度比例计算，大于1和小于等于0表示固定的像素值。默认值为0，表示在视图水平靠左的位置。
     * @param y0 起点纵坐标。0-1表示按视图高度比例计算，大于1和小于等于0表示固定的像素值。默认值为0，表示在视图垂直靠上的位置。
     * @param x1 终点横坐标。0-1表示按视图宽度比例计算，大于1和小于等于0表示固定的像素值。默认值为1，表示在视图水平靠右的位置。
     * @param y1 终点纵坐标。0-1表示按视图高度比例计算，大于1和小于等于0表示固定的像素值。默认值为1，表示在视图垂直靠下的位置。
     * @param colors 颜色数组，不同位置的颜色值
     * @param positions 位置数组，指定各个颜色的位置。设置的值范围时0-1，0表示起始位置, 1表示结束位置
     * @param mode 平铺方式，参考"TileMode"类的常量
     */
    void setBackgroundLinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, int mode);

    /**
     * 设置线性渐变背景
     * @param x0 起点横坐标。0-1表示按视图宽度比例计算，大于1和小于等于0表示固定的像素值。默认值为0，表示在视图水平靠左的位置。
     * @param y0 起点纵坐标。0-1表示按视图高度比例计算，大于1和小于等于0表示固定的像素值。默认值为0，表示在视图垂直靠上的位置。
     * @param x1 终点横坐标。0-1表示按视图宽度比例计算，大于1和小于等于0表示固定的像素值。默认值为1，表示在视图水平靠右的位置。
     * @param y1 终点纵坐标。0-1表示按视图高度比例计算，大于1和小于等于0表示固定的像素值。默认值为1，表示在视图垂直靠下的位置。
     * @param color1 开始的颜色值
     * @param color2 结束的颜色值
     * @param mode 平铺方式，参考"TileMode"类的常量
     */
    void setBackgroundLinearGradient(float x0, float y0, float x1, float y1, int color1, int color2, int mode);

    /**
     *
     * @param centerX 中心点横坐标，0-1表示百分比，大于1和小于等于0表示固定的像素值。默认值为0.5f，表示在视图水平方向的中间位置。
     * @param centerY 中心点纵坐标，0-1表示百分比，大于1和小于等于0表示固定的像素值。默认值为0.5f，表示在视图垂直方向的中间位置。
     * @param radius 环形的半径，小于0时表示按视图宽度或高度的比例计算。
     *               大于等于0表示固定的像素值；
     *               -1 <= radius < 0 时，表示按短边的比例计算；
     *               -2 <= radius < -1 时，表示按长边的比例计算。
     *               -3 <= radius < -2 时，表示按视图宽度的比例计算。
     *               -4 <= radius < -3 时，表示按视图高度的比例计算。
     *               默认值为-1，即半径为视图最短边的长度。
     * @param colors 颜色数组，不同位置的颜色值
     * @param stops 位置数组，指定各个颜色的位置。设置的值范围时0-1，0表示起始位置, 1表示结束位置
     * @param mode 平铺方式，参考"TileMode"类的常量
     */
    void setBackgroundRadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, int mode);

    /**
     *
     * @param centerX 中心点横坐标，0-1表示百分比，大于1和小于等于0表示固定的像素值。默认值为0.5f，表示在视图水平方向的中间位置。
     * @param centerY 中心点纵坐标，0-1表示百分比，大于1和小于等于0表示固定的像素值。默认值为0.5f，表示在视图垂直方向的中间位置。
     * @param radius 环形的半径，小于0时表示按视图宽度或高度的比例计算。
     *               大于等于0表示固定的像素值；
     *               -1 <= radius < 0 时，表示按短边的比例计算；
     *               -2 <= radius < -1 时，表示按长边的比例计算。
     *               -3 <= radius < -2 时，表示按视图宽度的比例计算。
     *               -4 <= radius < -3 时，表示按视图高度的比例计算。
     *               默认值为-1，即半径为视图最短边的长度。
     * @param centerColor 中心点颜色
     * @param edgeColor 边缘颜色
     * @param mode 平铺方式，参考"TileMode"类的常量
     */
    void setBackgroundRadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, int mode);

    /**
     * 同时设置视图的四个角的圆角大小
     * @param radius 圆角大小
     */
    void corner(int radius);

    /**
     * 分别设置视图四个角的圆角大小
     * @param topLeft 左上角
     * @param topRight 右上角
     * @param bottomRight 右下角
     * @param bottomLeft 左下角
     */
    void corner(float topLeft, float topRight, float bottomRight, float bottomLeft);

    /**
     * 视图有四个角，每个角有x和y两个方向的圆角大小，共8个圆角值
     * @param topLeftX 左上角x方向的圆角大小
     * @param topLeftY 左上角y方向的圆角大小
     * @param topRightX 右上角x方向的圆角大小
     * @param topRightY 右上角y方向的圆角大小
     * @param bottomRightX 右下角x方向的圆角大小
     * @param bottomRightY 右下角y方向的圆角大小
     * @param bottomLeftX 左下角x方向的圆角大小
     * @param bottomLeftY 左下角y方向的圆角大小
     */
    void corner(float topLeftX, float topLeftY, float topRightX, float topRightY,
                       float bottomRightX, float bottomRightY, float bottomLeftX, float bottomLeftY);


    /**
     * 设置视图圆角化，其内部的子视图不会遮盖圆角
     * @param radius 圆角大小，单位为px
     */
    void cornerClip(float radius);

    /**
     * 取消视图的圆角化
     */
    void cancelCornerClip();

    /**
     * 置边框宽度
     * @param w 宽度
     */
    void borderWidth(int w);

    /**
     * 取边框宽度
     */
    int borderWidth();

    /**
     * 置边框颜色
     * @param color 颜色
     */
    void borderColor(int color);

    /**
     * 取边框颜色
     */
    int borderColor();

    /**
     * 取背景图片的位图数据
     */
    Bitmap getBackgroundBitmap();

    /**
     * 置背景图片
     * @param resId 图片资源id
     */
    void background(int resId);

    /**
     * 置背景图片
     * @param bitmap 图片位图数据
     */
    void background(Bitmap bitmap);

    /**
     * 置背景图片，注意需要先申请读取文件的权限(READ_EXTERNAL_STORAGE)
     * @param filePath 图片文件地址
     */
    void background(String filePath);

    /**
     * 置背景图片
     * @param bytes 字节数组
     */
    void background(byte[] bytes);

    /**
     * 置水波纹特效，注意设置该特效后，组件的其他圆角、阴影，边框等效果均失效。
     * @param enable 是否启用
     */
    void setRippleEffectEnable(boolean enable);

    /**
     * 置视图可视状态改变的事件回调
     * @param event 回调的接口事件
     */
    void setOnVisibilityChange(LonView.VisibilityChangeCallback event);

    /**
     * 置视图焦点改变的事件回调
     * @param event 回调的接口事件
     */
    void setOnFocusChange(LonView.FocusChangeCallback event);

    /**
     * 置视图尺寸被改变的事件回调
     * @param event 回调的接口事件
     */
    void setOnSizeChange(LonView.SizeChangeCallback event);

    /**
     * 置视图生命周期改变的事件回调
     * @param event 回调的接口事件
     */
    void setOnLiftChange(LonView.LifeCallback event);

    /**
     * 置被单击的回调事件
     * @param event 回调的接口事件
     */
    void  setOnClick(LonView.ClickCallback event);

    /**
     * 置被长按的回调
     * @param event 回调的接口事件
     */
    void  setOnLongClick(LonView.ClickCallback event);

    /**
     * 置触摸回调
     * @param touchCallback 回调事件
     */
    void setOnTouch(LonView.TouchCallback touchCallback);


    /**
     * 视图可视状态改变
     *
     * @param view       视图对象
     * @param visibility 可视状态
     */
    void onViewVisibilityChanged(android.view.View view, int visibility);

    /**
     * 视图被创建
     */
    void onViewCreate();

    /**
     * 视图被销毁
     */
    void onViewDestroy();

    /**
     * 视图焦点变化
     *
     * @param gainFocus 是否获得焦点
     */
    void onViewFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect);

    /**
     * 视图尺寸被改变
     *
     * @param newWidth  新宽度
     * @param newHeight 新高度
     * @param oldWidth  原宽度
     * @param oldHeight 原高度
     */
    void onViewSizeChange(int newWidth, int newHeight, int oldWidth, int oldHeight);

}
